package com.example.backend.annotation.validation;

import com.example.backend.annotation.constraint.ValideDecimal102;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.math.BigDecimal;

public class Decimal102Validator implements ConstraintValidator<ValideDecimal102, BigDecimal> {
    private boolean nullable;

    @Override
    public void initialize(ValideDecimal102 constraintAnnotation) {
        this.nullable = constraintAnnotation.nullable();
    }

    @Override
    public boolean isValid(BigDecimal value, ConstraintValidatorContext context) {
        // 处理允许为空的情况
        if (value == null) {
            return nullable;
        }

        // 检查 scale 是否合法（必须 >= 0 且 <= 2）
        int scale = value.scale();
        if (scale < 0 || scale > 2) {
            return false;
        }

        // 获取原始字符串表示（不进行去零操作）
        String stringValue = value.toPlainString();

        // 判断是否有小数点
        int dotIndex = stringValue.indexOf('.');
        if (dotIndex != -1) {
            // 分割整数和小数部分
            String integerPart = stringValue.substring(0, dotIndex);
            String decimalPart = stringValue.substring(dotIndex + 1);

            // 去除符号后检查整数位数
            int integerDigits = integerPart.replaceFirst("^-+", "").length();
            int decimalDigits = decimalPart.length();

            return integerDigits <= 8 && decimalDigits <= 2 && (integerDigits + decimalDigits) <= 10;
        } else {
            // 无小数点，检查整数位数（去除符号）
            int integerDigits = stringValue.replaceFirst("^-+", "").length();
            return integerDigits <= 8;
        }
    }
}

